Creating a randomized graph is actually quite useful. Seeing these graphs with specified numbers of nodes and edges will allow you to quickly get a sense of how connected graphs can be at different sizes.

Setup

Ensure that the development version of DiagrammeR is installed. Load in the package with library().

#devtools::install_github("rich-iannone/DiagrammeR")
library("DiagrammeR")

Part 1. Random Graphs with create_random_graph()

The create_random_graph() function is provided in DiagrammeR with several options for creating random graphs. In all of the examples, the function will pipe the graph object to the render_graph() function (using the magrittr %>% operator) with the output = "visNetwork" option set. This is useful for quickly inspecting the graph upon creation.

To start, we can create a not-so-random graph with 2 nodes (n argument) and 1 edge (m argument). By default, the graph produced is an undirected graph.

# Create a random graph with 2 nodes, an edge,
# and display the graph
create_random_graph(n = 2, m = 1) %>% render_graph()

It’s obviously better to make a graph with more nodes and edges. Next, we will create a random graph with 15 nodes and 30 edges:

create_random_graph(n = 15, m = 30) %>% render_graph()

In all of the random graphs created with this function, there is only one edge created for each pair of nodes (i.e., no cases with multiple edges between nodes).

If you specify a number of edges that exceeds the number in a fully-connected graph of size n, you get an error. It’s an informative error (providing the maximum number of edges m for the given n) but it’s an error nonetheless.

create_random_graph(n = 15, m = 200) %>% render_graph()
Error in create_random_graph(n = 15, m = 200) : 
  The number of edges exceeds the maximum possible (105)

So, using n = 15 and m = 105 will yield a fully-connected graph (without loops though) with 15 nodes (this is much the same as using create_graph() %>% add_full_graph(n = 15, keep_loops = FALSE)). Here is the output graph:

create_random_graph(n = 15, m = 105) %>% render_graph()

Alternatively, you don’t need to have edges in the randomly generated graph. Simply specify m = 0 for any number of nodes n:

# Create a random graph with 512 nodes and no edges;
# output a data frame with node and edge counts
create_random_graph(n = 512, m = 0) %>%
  {
    node_count <- get_node_df(.) %>% nrow()
    edge_count <- get_edge_df(.) %>% nrow()
    data.frame(nodes = node_count, edges = edge_count)
  }

Part 2. Random Yet Reproducible

Setting a seed is a great way to create something random yet reproduceable/re-usable. This can be done within the create_random_graph() function by specifying a seed number with the argument set_seed. Here’s an example

create_random_graph(n = 4, m = 4, set_seed = 30) %>% render_graph()

Upon repeat runs, the connections in the graph will be the same each and every time (e.g., node 1 is attached to all other nodes, 2 is connected to 1, etc.).

Part 3. Directed/Undirected Randomness

By default, the random graphs generated are undirected. To produce directed graphs, simply include directed = TRUE in the create_random_graph() statement.

create_random_graph(n = 15, m = 22, directed = TRUE) %>% render_graph()
LS0tDQp0aXRsZTogIjAwMiAtIFJhbmRvbSBHcmFwaHMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpDcmVhdGluZyBhIHJhbmRvbWl6ZWQgZ3JhcGggaXMgYWN0dWFsbHkgcXVpdGUgdXNlZnVsLiBTZWVpbmcgdGhlc2UgZ3JhcGhzIHdpdGggc3BlY2lmaWVkIG51bWJlcnMgb2Ygbm9kZXMgYW5kIGVkZ2VzIHdpbGwgYWxsb3cgeW91IHRvIHF1aWNrbHkgZ2V0IGEgc2Vuc2Ugb2YgaG93IGNvbm5lY3RlZCBncmFwaHMgY2FuIGJlIGF0IGRpZmZlcmVudCBzaXplcy4NCg0KIyMgU2V0dXANCg0KRW5zdXJlIHRoYXQgdGhlIGRldmVsb3BtZW50IHZlcnNpb24gb2YgKipEaWFncmFtbWVSKiogaXMgaW5zdGFsbGVkLiBMb2FkIGluIHRoZSBwYWNrYWdlIHdpdGggYGxpYnJhcnkoKWAuDQoNCmBgYHtyIGxvYWRfcGFja2FnZXMsIHJlc3VsdHM9RkFMU0V9DQojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJyaWNoLWlhbm5vbmUvRGlhZ3JhbW1lUiIpDQoNCmxpYnJhcnkoIkRpYWdyYW1tZVIiKQ0KYGBgDQoNCiMjIFBhcnQgMS4gUmFuZG9tIEdyYXBocyB3aXRoIGBjcmVhdGVfcmFuZG9tX2dyYXBoKClgDQoNClRoZSBgY3JlYXRlX3JhbmRvbV9ncmFwaCgpYCBmdW5jdGlvbiBpcyBwcm92aWRlZCBpbiAqKkRpYWdyYW1tZVIqKiB3aXRoIHNldmVyYWwgb3B0aW9ucyBmb3IgY3JlYXRpbmcgcmFuZG9tIGdyYXBocy4gSW4gYWxsIG9mIHRoZSBleGFtcGxlcywgdGhlIGZ1bmN0aW9uIHdpbGwgcGlwZSB0aGUgZ3JhcGggb2JqZWN0IHRvIHRoZSBgcmVuZGVyX2dyYXBoKClgIGZ1bmN0aW9uICh1c2luZyB0aGUgKiptYWdyaXR0cioqIGAlPiVgIG9wZXJhdG9yKSB3aXRoIHRoZSBgb3V0cHV0ID0gInZpc05ldHdvcmsiYCBvcHRpb24gc2V0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgcXVpY2tseSBpbnNwZWN0aW5nIHRoZSBncmFwaCB1cG9uIGNyZWF0aW9uLg0KDQpUbyBzdGFydCwgd2UgY2FuIGNyZWF0ZSBhIG5vdC1zby1yYW5kb20gZ3JhcGggd2l0aCAyIG5vZGVzIChgbmAgYXJndW1lbnQpIGFuZCAxIGVkZ2UgKGBtYCBhcmd1bWVudCkuIEJ5IGRlZmF1bHQsIHRoZSBncmFwaCBwcm9kdWNlZCBpcyBhbiB1bmRpcmVjdGVkIGdyYXBoLg0KDQpgYGB7ciBjcmVhdGVfcmFuZG9tX2dyYXBoX3JlbmRlcn0NCiMgQ3JlYXRlIGEgcmFuZG9tIGdyYXBoIHdpdGggMiBub2RlcywgYW4gZWRnZSwNCiMgYW5kIGRpc3BsYXkgdGhlIGdyYXBoDQpjcmVhdGVfcmFuZG9tX2dyYXBoKG4gPSAyLCBtID0gMSkgJT4lIHJlbmRlcl9ncmFwaCgpDQpgYGANCg0KSXQncyBvYnZpb3VzbHkgYmV0dGVyIHRvIG1ha2UgYSBncmFwaCB3aXRoIG1vcmUgbm9kZXMgYW5kIGVkZ2VzLiBOZXh0LCB3ZSB3aWxsIGNyZWF0ZSBhIHJhbmRvbSBncmFwaCB3aXRoIDE1IG5vZGVzIGFuZCAzMCBlZGdlczoNCg0KYGBge3IgY3JlYXRlX3JhbmRvbV9ncmFwaF9yZW5kZXJfMn0NCmNyZWF0ZV9yYW5kb21fZ3JhcGgobiA9IDE1LCBtID0gMzApICU+JSByZW5kZXJfZ3JhcGgoKQ0KYGBgDQoNCkluIGFsbCBvZiB0aGUgcmFuZG9tIGdyYXBocyBjcmVhdGVkIHdpdGggdGhpcyBmdW5jdGlvbiwgdGhlcmUgaXMgb25seSBvbmUgZWRnZSBjcmVhdGVkIGZvciBlYWNoIHBhaXIgb2Ygbm9kZXMgKGkuZS4sIG5vIGNhc2VzIHdpdGggbXVsdGlwbGUgZWRnZXMgYmV0d2VlbiBub2RlcykuDQoNCklmIHlvdSBzcGVjaWZ5IGEgbnVtYmVyIG9mIGVkZ2VzIHRoYXQgZXhjZWVkcyB0aGUgbnVtYmVyIGluIGEgZnVsbHktY29ubmVjdGVkIGdyYXBoIG9mIHNpemUgYG5gLCB5b3UgZ2V0IGFuIGVycm9yLiBJdCdzIGFuIGluZm9ybWF0aXZlIGVycm9yIChwcm92aWRpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVkZ2VzIGBtYCBmb3IgdGhlIGdpdmVuIGBuYCkgYnV0IGl0J3MgYW4gZXJyb3Igbm9uZXRoZWxlc3MuDQoNCmBgYHtyIGNyZWF0ZV9yYW5kb21fZ3JhcGhfdG9vX21hbnlfZWRnZXN9DQoNCmNyZWF0ZV9yYW5kb21fZ3JhcGgobiA9IDE1LCBtID0gMjAwKSAlPiUgcmVuZGVyX2dyYXBoKCkNCmBgYA0KDQpTbywgdXNpbmcgYG4gPSAxNWAgYW5kIGBtID0gMTA1YCB3aWxsIHlpZWxkIGEgZnVsbHktY29ubmVjdGVkIGdyYXBoICh3aXRob3V0IGxvb3BzIHRob3VnaCkgd2l0aCAxNSBub2RlcyAodGhpcyBpcyBtdWNoIHRoZSBzYW1lIGFzIHVzaW5nIGBjcmVhdGVfZ3JhcGgoKSAlPiUgYWRkX2Z1bGxfZ3JhcGgobiA9IDE1LCBrZWVwX2xvb3BzID0gRkFMU0UpYCkuIEhlcmUgaXMgdGhlIG91dHB1dCBncmFwaDoNCg0KYGBge3IgY3JlYXRlX3JhbmRvbV9ncmFwaF9mdWxseV9jb25uZWN0ZWR9DQpjcmVhdGVfcmFuZG9tX2dyYXBoKG4gPSAxNSwgbSA9IDEwNSkgJT4lIHJlbmRlcl9ncmFwaCgpDQpgYGANCg0KQWx0ZXJuYXRpdmVseSwgeW91IGRvbid0IG5lZWQgdG8gaGF2ZSBlZGdlcyBpbiB0aGUgcmFuZG9tbHkgZ2VuZXJhdGVkIGdyYXBoLiBTaW1wbHkgc3BlY2lmeSBgbSA9IDBgIGZvciBhbnkgbnVtYmVyIG9mIG5vZGVzIGBuYDoNCg0KYGBge3IgY3JlYXRlX3JhbmRvbV9ncmFwaF81MTJfbm9kZXNfMF9lZGdlc30NCiMgQ3JlYXRlIGEgcmFuZG9tIGdyYXBoIHdpdGggNTEyIG5vZGVzIGFuZCBubyBlZGdlczsNCiMgb3V0cHV0IGEgZGF0YSBmcmFtZSB3aXRoIG5vZGUgYW5kIGVkZ2UgY291bnRzDQpjcmVhdGVfcmFuZG9tX2dyYXBoKG4gPSA1MTIsIG0gPSAwKSAlPiUNCiAgew0KICAgIG5vZGVfY291bnQgPC0gZ2V0X25vZGVfZGYoLikgJT4lIG5yb3coKQ0KICAgIGVkZ2VfY291bnQgPC0gZ2V0X2VkZ2VfZGYoLikgJT4lIG5yb3coKQ0KICAgIGRhdGEuZnJhbWUobm9kZXMgPSBub2RlX2NvdW50LCBlZGdlcyA9IGVkZ2VfY291bnQpDQogIH0NCmBgYA0KDQojIFBhcnQgMi4gUmFuZG9tIFlldCBSZXByb2R1Y2libGUNCg0KU2V0dGluZyBhIHNlZWQgaXMgYSBncmVhdCB3YXkgdG8gY3JlYXRlIHNvbWV0aGluZyByYW5kb20geWV0IHJlcHJvZHVjZWFibGUvcmUtdXNhYmxlLiBUaGlzIGNhbiBiZSBkb25lIHdpdGhpbiB0aGUgYGNyZWF0ZV9yYW5kb21fZ3JhcGgoKWAgZnVuY3Rpb24gYnkgc3BlY2lmeWluZyBhIHNlZWQgbnVtYmVyIHdpdGggdGhlIGFyZ3VtZW50IGBzZXRfc2VlZGAuIEhlcmUncyBhbiBleGFtcGxlDQoNCmBgYHtyIGNyZWF0ZV9yYW5kb21fZ3JhcGhfd19zZWVkfQ0KY3JlYXRlX3JhbmRvbV9ncmFwaChuID0gNCwgbSA9IDQsIHNldF9zZWVkID0gMzApICU+JSByZW5kZXJfZ3JhcGgoKQ0KYGBgDQoNClVwb24gcmVwZWF0IHJ1bnMsIHRoZSBjb25uZWN0aW9ucyBpbiB0aGUgZ3JhcGggd2lsbCBiZSB0aGUgc2FtZSBlYWNoIGFuZCBldmVyeSB0aW1lIChlLmcuLCBub2RlIGAxYCBpcyBhdHRhY2hlZCB0byBhbGwgb3RoZXIgbm9kZXMsIGAyYCBpcyBjb25uZWN0ZWQgdG8gYDFgLCBldGMuKS4NCg0KIyMgUGFydCAzLiBEaXJlY3RlZC9VbmRpcmVjdGVkIFJhbmRvbW5lc3MNCg0KQnkgZGVmYXVsdCwgdGhlIHJhbmRvbSBncmFwaHMgZ2VuZXJhdGVkIGFyZSB1bmRpcmVjdGVkLiBUbyBwcm9kdWNlIGRpcmVjdGVkIGdyYXBocywgc2ltcGx5IGluY2x1ZGUgYGRpcmVjdGVkID0gVFJVRWAgaW4gdGhlIGBjcmVhdGVfcmFuZG9tX2dyYXBoKClgIHN0YXRlbWVudC4NCg0KYGBge3IgY3JlYXRlX3JhbmRvbV9ncmFwaF9kaXJlY3RlZH0NCmNyZWF0ZV9yYW5kb21fZ3JhcGgobiA9IDE1LCBtID0gMjIsIGRpcmVjdGVkID0gVFJVRSkgJT4lIHJlbmRlcl9ncmFwaCgpDQpgYGANCg==